package br.edu.uniritter.liquid.democracy.dao;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
public abstract class AbstractDao<T> {
protected final EntityManager entityManager;
protected final Class<T> clazz;
@SuppressWarnings("unchecked")
protected AbstractDao(EntityManager entityManager) {
Class<T> clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
this.entityManager = entityManager;
this.clazz = clazz;
}
public void create(T entity) {
entityManager.persist(entity);
}
public T update(T entity) {
return entityManager.merge(entity);
}
public void delete(T entity) {
entityManager.remove(entity);
}
public T findById(Long id) {
return entityManager.find(clazz, id);
}
@SuppressWarnings("unchecked")
public T findUniqCriteria(Criteria criteria){
List<T> list = criteria.list();
T entity = null;
if(!list.isEmpty() && list.size() == 1)
entity = list.get(0);
return entity;
}
@SuppressWarnings("unchecked")
public List<T> findAll() {
Query query = entityManager.createQuery("from " + clazz.getName());
List<T> resultList = query.getResultList();
return resultList;
}
@SuppressWarnings("unchecked")
public List<T> findByName(String name) {
Criteria criteria = getSession().createCriteria(clazz.getName());
criteria.add(Restrictions.ilike("name", name.toUpperCase(), MatchMode.START));
return criteria.list();
}
public Session getSession(){
Session session;
session = (Session) entityManager.getDelegate();
return session;
}
}